// // symbol 证明是每个是不相等的
// let s1 = Symbol();
// let s2 = Symbol();
// let s3 = Symbol();
// console.log(s1==s2,s2==s3,s1==s3);  //false false false
// // 没有使用严格等于可是还是不相等

// // 填写相同的字符串 是否相等
// let a1 = Symbol('foo');
// let a2 = Symbol('foo');
// let a3 = Symbol('foo2');
// // 打印symbol 的名字
// console.log(a1.toString(),a2.toString(),a3.toString());
// console.log(a1 == a2);  //false


// // symbol 不能使用new命令

// let s1 = new Symbol();
// console.log(s1.toSting())   //Symbol is not a constructor at new Symbol     符号不是新符号的构造函数


// //  symbol 不能与其他类型值运算
// let w1 = Symbol();
// // 布尔值
// let w2 = true;
// // 字符串
// let w3 = '字符串';
// // 数字
// let w4 = 444;
// // console.log(`布尔值和symbol：${w1}${w2}`)       //Cannot convert a Symbol value to a string 无法将符号值转换为字符串
// console.log(`布尔值和字符串：${w2}${w3}`)       //布尔值和字符串：true字符串
// console.log(`布尔值和数字：${w2}${w4}`)         // 布尔值和数字：true444
// console.log(`字符串和数字：${w3}${w4}`)         // 字符串和数字：字符串444
// console.log(`布尔值和symbol：${w1.toString()}${w2}`)      //可以先把 symbol 转换成 字符串在进行运算

// // symbol可以转换为 布尔值 
// console.log(`symbol转换为：${Boolean(w1)}`);        //symbol转换为：true

// symbol 作为健名使用
// symbol 不能使用点运算符获取 点运算符获取的是对象
// let s = Symbol();
// let j = {
//     [s]:'111',
//     s:'2222'
// }
// j.s = 3333
// console.log(j[s],j.s);


// // 消除魔术字符串
// // 有魔术字符串
// function test1(a) {
//     if (a === 1) {
//         console.log('有魔术字符串正确执行了')
//     }
// }
// // 没有魔术字符串了
// const j = {
//     a: Symbol()
// }

// function test2(a) {
//     if (a === j.a) {
//         console.log('没有魔术字符串正确执行了')
//     }
// }

// test1(1);
// test2(j.a);

// // symbol 遍历
// let a = Symbol('a');
// let obj = {
//     [a]: 0,
//     b: Symbol('b'),
//     c: 'hello'
// }

// // 遍历不到 a 属性
// for (const i in obj) {
//     console.log('forin',i,obj[i])
// }

// // // forof 无法遍历 symbol
// // for (const i of obj) {
// //     console.log(i)
// // }

// // 无法遍历到 symbol
// console.log('Obeject.keys',Object.keys(obj));
// // 无法遍历到 symbol
// console.log('Object.getOwnPropertyNames',Object.getOwnPropertyNames(obj));
// // 只会遍历到 symbol 属性
// console.log('Object.getOwnPropertySymbols',Object.getOwnPropertySymbols(obj));
// // 这个只为强调一点，这个是公有属性一般的遍历有遍历不到，可以作为，公有内部属性使用。

// symbol.for
// let s1 = Symbol.for('foo');
// let s2 = Symbol.for('foo');
// let s3 = Symbol('foo');
// console.log(s1 === s2);     //true
// console.log(s1 === s3);     //false

// symbol.keyFor

// let s1 = Symbol.for('to');
// let s2 = Symbol('foo');
// console.log(Symbol.keyFor(s1));     //to
// console.log(Symbol.keyFor(s2));     //undefined